To Do List

Data

The object sessDat has data from all 6 sessions.

Variables in sessDat

Summary Statistics

Summary of sessions and subjects.

Sessions were run at the New York University Abu Dhabi and the United Arab Emirates with undergraduate students between Oct 17 and Oct 19th, 2017.

Subjects earned on average $84.25 from the experiment. After a 30 AED show-up fee and rounding up to the 5 AED, subjects walked away on average with $114.25

The experiment was conducted with oTree (Citation: Chen, D.L., Schonger, M., Wickens, C., 2016. oTree - An open-source platform for laboratory, online and field experiments. Journal of Behavioral and Experimental Finance, vol 9: 88-97) subjects were recruited with hroot (Citation: Bock, Olaf, Ingmar Baetge & Andreas Nicklisch (2014). hroot – Hamburg registration and organization online tool. European Economic Review 71, 117-120)

Hypothesis 1 - competitiveness and mark-ups

Hypothesis 1. Static mark-ups will be lower in more competitive (higher N) markets.

In the plot below,

Number of Players Sessions Subjects Periods Per Session
Four Player 3 72 15
Two Player 3 48 15

In the pilot we had a spread of transport costs from 0.1 to 1.0. Between 0.1 and 0.5 there wasn’t a huge difference in price, only at 0.75 and 1.0 did we see a substantial increase in markups. In this design we only had a spread of transport costs between 0.1 and 0.6, and we don’t see a consistent increase in price as transport costs increase.


In the plot below,


Comparing prices in both treatments. - We see with greater competition there are lower prices accross all shopping costs.

Now, looking just at the later half of each period, subperiods 11 to 20, (remove from final)

playerNum 0.1 0.25 0.4 0.6
Four Player 0.31 (±0.0123) 0.23 (±0.0176) 0.28 (±0.0117) 0.31 (±0.024)
Two Player 0.55 (±0.0263) 0.41 (±0.039) 0.5 (±0.0255) 0.44 (±0.0419)

Strong evidence for Hypothesis 1.

playerNum 0.1 0.25 0.4 0.6
Four Player 0.31 (±0.0123) 0.23 (±0.0176) 0.28 (±0.0117) 0.31 (±0.024)
Two Player 0.55 (±0.0263) 0.41 (±0.039) 0.5 (±0.0255) 0.44 (±0.0419)

Hypothesis 2 - shipping costs and mark-ups

Hypothesis 2 - There is a positive relationship between shopping costs and mark-ups.

Looking at the two-player game


    Welch Two Sample t-test

data:  player.price[(playerNum == "Two Player" & player.transport_cost ==  and player.price[(playerNum == "Four Player" & player.transport_cost ==     0.25)] and     0.6)]
t = 5.5709, df = 176.38, p-value = 9.331e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.06173099 0.12946116
sample estimates:
mean of x mean of y 
0.4129291 0.3173331 


    Wilcoxon rank sum test with continuity correction

data:  player.price[(playerNum == "Two Player" & player.transport_cost ==  and player.price[(playerNum == "Four Player" & player.transport_cost ==     0.25)] and     0.6)]
W = 12880, p-value = 1.696e-07
alternative hypothesis: true location shift is not equal to 0

Recall there were 72 subjects in the four-player treatment and 48 subjects in the two-player treatment.

Initial Look at Two-Player Game

First, within the two player game, comparing prices in t = 0.1 and t = 0.6 (see below), there is to be a statistically significant difference.

There is a relationship between prices and shopping cost treatments. In higher shopping cost settings subjects tended to have higher prices.

  • Unit of observation is an individual’s average price within a period, at a set shopping cost level.
  • A t test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 2.867e-11
  • A MW rank sum test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 1.12e-09
Shopping Cost N Mean Price Median Price Standard Error
Four Player 0.10 648 0.312 0.303 0.005
Four Player 0.25 168 0.229 0.195 0.009
Four Player 0.40 576 0.280 0.260 0.004
Four Player 0.60 168 0.311 0.299 0.008
Two Player 0.10 432 0.547 0.523 0.008
Two Player 0.25 112 0.412 0.404 0.015
Two Player 0.40 384 0.500 0.482 0.008
Two Player 0.60 112 0.443 0.436 0.012

Initial Look at Four-Player Game

In the four-player game the relationship, at least between the lowest and highest shopping cost, does not appear stronger.

  • A t test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 0.9459.
  • A MW rank sum test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value = 0.8919

    Welch Two Sample t-test

data:  mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
t = 7.0137, df = 218.42, p-value = 2.867e-11
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.0748557 0.1333672
sample estimates:
mean of x mean of y 
0.5472454 0.4431339 


    Wilcoxon rank sum test with continuity correction

data:  mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
W = 33222, p-value = 1.12e-09
alternative hypothesis: true location shift is not equal to 0

Model

Only looking at the first half of periods


    Welch Two Sample t-test

data:  mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
t = 0.06797, df = 310.47, p-value = 0.9459
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.01850285  0.01982693
sample estimates:
mean of x mean of y 
0.3118495 0.3111875 


    Wilcoxon rank sum test with continuity correction

data:  mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
W = 54802, p-value = 0.8919
alternative hypothesis: true location shift is not equal to 0

Here we have a log-log model regressing prices on shopping costs, with player-number fixed effects.

\(ln(P_{ip}) = \beta_0 + \beta_1 \delta_{i} + \beta_2 ln(S_{ip}) + \beta_3 Period_p + \epsilon_{(ip)}\)

  • Where \(P_{ip}\) is the average price for for this participant in this period, the average of 20 sub-periods.
  • \(\delta_{i}\) is an indicator equal to 1 if individual \(i\) participated in the two-player treatment.
  • \(S_ip\) is the shopping cost this individual faced in this period.
  • where \(Period_p\) is the period number. Period fixed effects.

In this specification, the coefficient \(\beta_2\) measures the average effect of being assigned to the less competitive two-player treatment group. With \(\beta_2 = -0.056040\), a 1% increase in shopping costs leads to a -5.6% decrease in prices. This is significant.

Hypothesis 3 - mark-up responsiveness to competition

Hypothesis 3. Mark-ups will be less responsive to changes in shopping costs in less competitive (lower N) markets.

\(ln(Price_{(i,p)}) = \beta_0 + \beta_1 \delta_{2p} + \beta_2 ln(ShoppingCost) + \beta_3 \delta_{i} ln(ShoppingCost) + \epsilon_{(i,p)}\)


Call:
lm(formula = log(price) ~ playerNum + log(player.transport_cost) + 
    player.period_number, data = df %>% mutate(price = price + 
    0.01))

Residuals:
     Min       1Q   Median       3Q      Max 
-1.66267 -0.22208  0.01354  0.24857  1.05850 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                -1.272706   0.025519 -49.873  < 2e-16 ***
playerNumTwo Player         0.540056   0.017600  30.685  < 2e-16 ***
log(player.transport_cost) -0.074936   0.012182  -6.151 9.45e-10 ***
player.period_number       -0.003878   0.002013  -1.926   0.0542 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3658 on 1796 degrees of freedom
Multiple R-squared:  0.3532,    Adjusted R-squared:  0.3521 
F-statistic: 326.9 on 3 and 1796 DF,  p-value: < 2.2e-16

The coefficient \(\beta_2\) estimates that a 1% increase in shopping costs will leave to a 3.4% decrease in prices in the four-player game. The \(\beta_3\) coefficient indicates a one unit increase in shopping cost leads to a 5.9% decrease in prices in the two-player game relative to the 4-player game“.


Call:
lm(formula = log(price) ~ playerNum + log(player.transport_cost) + 
    playerNum:log(player.transport_cost), data = df %>% mutate(price = price + 
    0.01))

Residuals:
     Min       1Q   Median       3Q      Max 
-1.68752 -0.22339  0.01848  0.25154  1.05189 

Coefficients:
                                               Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                    -1.26325    0.02628 -48.071  < 2e-16 ***
playerNumTwo Player                             0.45058    0.04155  10.844  < 2e-16 ***
log(player.transport_cost)                     -0.04844    0.01558  -3.108  0.00191 ** 
playerNumTwo Player:log(player.transport_cost) -0.05857    0.02464  -2.377  0.01756 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3656 on 1796 degrees of freedom
Multiple R-squared:  0.3539,    Adjusted R-squared:  0.3528 
F-statistic: 327.9 on 3 and 1796 DF,  p-value: < 2.2e-16
Dependent Var: \(ln(P_{ip})\) Model 1 Model 2
\(\delta_{i}\) (two-player) 0.559101 *** 0.45058 ***
(0.015870) (0.04155)
\(ln(ShoppingCost)\) -0.056040 *** -0.04844 ***
(0.011023) (0.01558)
\(\delta_{i} \cdot ln(ShoppingCost)\) -0.05857 *
(0.02464)
————————————— —— ——
N 552 552

Hypothesis 4 - Collusion and Shopping Costs

Hypothesis 4. Collusion will be easier to form in low shopping cost environments

Define collusion

Idea 1 - Joint positive profits.

A subject is said to be ‘colluding’ when they and their adjacent players have jointly positive profits. - In the save of the two-player game, both players’ profits are positive. In the case of the four-player game, the profits of the two players to the left and right (circle marketplace) are positive. - This poses of problem in comparing “collusion” between two and four-player games. So we should not do that. - Look at violines for bit - bi-modal splits in distribution.

Shopping Cost Percent of Period Joint Positive Profits Period Group Obvservation
Two Player 0.10 0.3442073 112
Two Player 0.25 0.6750000 56
Two Player 0.40 0.7213235 112
Two Player 0.60 0.8921875 56
Four Player 0.10 0.2357724 84
Four Player 0.25 0.2904762 42
Four Player 0.40 0.3745098 84
Four Player 0.60 0.4791667 42

There is visually suggestive evidence that with higher shopping costs, groups are better able to collude.

Idea 2 - Just look at profits.

Are profits higher? - Perhaps too linked to the discussion in Hypothesis 1-3.

to do for collusion

Tailing thing;

  • get into more simple dynamics of collusion….

Compiled by Curtis Kephart, curtis.kephart@nyu.edu, with R Markdown Notebook.

Some new stuff: Look at how average prices change at the threshold around the first half second half change. Begin by building an indicator for what variable is changing (rp, transpo, or millcost) and only analyze data specific to those questions, otherwise you’re mixing a lot of effects together.

Question 1, what parameters are changing in these different periods: Answer: see data table below, I’ve figured out which paramters change in certain periods.

2018-03-23 00:16:16 GMT, Europe/Berlin

Want to do a regression on periods where only transport costs changed and use period fixed effects to strip out the level effects of the other parameters.

These results suggest that negative (insignificant) relationship between transport costs and prices in 2 player game, and positive, significant, relationship in the 4p game. These are the same results we had in the pilot study more or less.

LS0tCnRpdGxlOiAiT24gdGhlIGR5bmFtaWNzIG9mIG1hcmstdXBzLCByZXN1bHRzIHNlY3Rpb24iCmF1dGhvcjogCi0gIkN1cnRpcyBLZXBoYXJ0IgotICJEYXZpZCBNdW5ybyIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ193aWR0aDogNwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoKVG8gRG8gTGlzdAoKLSBBREQgIGEgZmlyc3QgaGFsZiBzZWNvbmQgaGFsZiBpbmRpY2F0b3IgLSBkb25lLCBzZWUgZmllbGQgYHBlcmlvZF9oYWxmYC4KLSBDb2RlIHRoYXQgcnVucy4gCi0gR2V0IGdpdGh1YiB1cCBhbmQgcnVubmluZwoKCmBgYHtyIHV0aWwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSApIAojbWFrZSBzdXJlIHlvdSBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gCgpgYGAKIAoKYGBge3IsIHNldHVwLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRSwgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZ2x1ZSkKCnNvdXJjZSgiLi4vci9ldGwuUiIpCgpzZXNzRGF0ID0gc2Vzc0RhdCAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBncm91cF9ieShwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lIAogIG11dGF0ZSgKICAgIHBsYXllck51bSA9IGdyb3VwX3NpemVfc3RyLAogICAgc2NvcmVfc3VicGVyaW9kID0gbGVhZChwbGF5ZXIucHJldl9yb3VuZF9wYXlvZmYpLAogICAgc2NvcmVfdG90YWwgPSBsZWFkKHBsYXllci5wcmV2X3JvdW5kX2N1bXVsYXRpdmVfcGF5b2ZmKQogICkKCmBgYAoKCiMgRGF0YQoKVGhlIG9iamVjdCBgc2Vzc0RhdGAgaGFzIGRhdGEgZnJvbSBhbGwgNiBzZXNzaW9ucy4gCgotIFRoZXJlIGFyZSBgciBzZXNzRGF0JHBhcnRpY2lwYW50LmNvZGUgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGhgIHN1YmplY3RzCi0gRWFjaCBzdWJqZWN0IHBhcnRpY2lwYXRlZCBpbiAxNSByb3VuZHMuIAotIEVhY2ggcm91bmQgaGFkIDIwIHN1YnBlcmlvZHMuIFRoZSBkYXRhIGxpc3RzIDIyIHN1YnBlcmlvZHMuIAogLSBTdWJwZXJpb2QgYDBgIGlzIHRoZSBzZXR0aW5ncyBgcGxheWVyLmxvY2AgYW5kIGBwbGF5ZXIucHJpY2VgIHRoZSBzdWJqZWN0IHdhcyBpbml0aWFsaXplZCBhdC4gCiAtIFN1YnBlcmlvZCBgMjFgIGlzIHRoZSBgcGxheWVyLnByaWNlYCB0aGUgc3ViamVjdCB3b3VsZCBiZSBhdCBpZiB0aGUgcGVyaW9kIGNvbnRpbnVlZC4gCgpWYXJpYWJsZXMgaW4gYHNlc3NEYXRgCgotIGBzZXNzaW9uLmNvZGVgCi0gYHBhcnRpY2lwYW50LmNvZGVgIGlzIGEgdW5pcXVlIHN1YmplY3QgaWRlbnRpZnllci4KLSBgcGxheWVyLnBlcmlvZF9udW1iZXJgCi0gYHBsYXllci5zdWJwZXJpb2RfbnVtYmVyYAotIGBwZXJpb2RfaGFsZmAgZWl0aGVyICJGaXJzdCBIYWxmIiBvciAiU2Vjb25kIEhhbGYiLiBgTkFgIGlmIHBlcmlvZCAwIG9yIDIxLiAgCi0gYHBsYXllci5sb2NgICBsb2NhdGlvbgotIGBwbGF5ZXIucHJpY2VgIHByaWNlCi0gYHBsYXllci5ib3VuZGFyeV9sb2AgYW5kIGBwbGF5ZXIuYm91bmRhcnlfaGlgIGFyZSB0aGUgaGlnaCBhbmQgbG93IGJvdW5kYXJ5IGZvciB0aGlzIHBsYXllciBjdXJyZW50bHkKLSBgZ3JvdXBfc2l6ZWAgbnVtYmVyIG9mIHBsYXllcnMgaW4gdGhlIGdyb3VwCi0gYGdyb3VwX3NpemVfc3RyYCBhIHN0cmluZyBmb3IgdGhlIGdyb3VwIHNpemUKLSBgcGxheWVyLnRyYW5zcG9ydF9jb3N0YCBzaG9wcGluZyBjb3N0LCBgMC4xMCwgMC4yNSwgMC40MCwgMC42MGAKLSBgcGxheWVyLm1jYCBtaWxsIGNvc3QsIGAwLjA1LCAwLjE1LCAwLjI1YAotIGBwbGF5ZXIucnBgIHJlc2VydmUgcHJpY2UsIGAwLjgsIDAuOSwgMS4wYAotIGBzY29yZV9zdWJwZXJpb2RgIHRoaXMgcGxheWVyJ3MgY3VycmVudCBzY29yZQotIGBzY29yZV90b3RhbGAgY3VycmVuY3kgcGVyaW9kJ3MgdG90YWwgc2NvcmUgZm9yIHRoaXMgcGxheWVyLiAKCgojIFN1bW1hcnkgU3RhdGlzdGljcwoKU3VtbWFyeSBvZiBzZXNzaW9ucyBhbmQgc3ViamVjdHMuCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCgpzZXNzRGF0ICU+JQogIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBTZXNzaW9ucyA9IHNlc3Npb24uY29kZSAlPiUgdW5pcXVlICU+JSBsZW5ndGgsCiAgICBTdWJqZWN0cyA9IHBhcnRpY2lwYW50LmNvZGUgJT4lIHVuaXF1ZSAlPiUgbGVuZ3RoLAogICAgUGVyaW9kcyAgPSBwbGF5ZXIucGVyaW9kX251bWJlciAlPiUgdW5pcXVlICU+JSBsZW5ndGggCiAgKSAlPiUKICBrYWJsZSgKICAgIGZvcm1hdCA9ICJtYXJrZG93biIsCiAgICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImMiKSwKICAgIGNvbC5uYW1lcyA9IGMoIk51bWJlciBvZiBQbGF5ZXJzIiwgIlNlc3Npb25zIiwgIlN1YmplY3RzIiwgIlBlcmlvZHMgUGVyIFNlc3Npb24iKQogICkKCmBgYAoKClNlc3Npb25zIHdlcmUgcnVuIGF0IHRoZSBOZXcgWW9yayBVbml2ZXJzaXR5IEFidSBEaGFiaSBhbmQgdGhlIFVuaXRlZCBBcmFiIEVtaXJhdGVzIHdpdGggdW5kZXJncmFkdWF0ZSBzdHVkZW50cyBiZXR3ZWVuIE9jdCAxNyBhbmQgT2N0IDE5dGgsIDIwMTcuIAoKU3ViamVjdHMgZWFybmVkIG9uIGF2ZXJhZ2UgXCRgciAtMzAgKyAoU3NQYXkgJT4lIGZpbHRlcighKFBheW1lbnQgJWluJSBjKDAsMzApKSkpJFBheW1lbnQgJT4lIG1lYW4gJT4lIHJvdW5kKDIpYCBmcm9tIHRoZSBleHBlcmltZW50LiBBZnRlciBhIDMwIEFFRCBzaG93LXVwIGZlZSBhbmQgcm91bmRpbmcgdXAgdG8gdGhlIDUgQUVELCBzdWJqZWN0cyB3YWxrZWQgYXdheSBvbiBhdmVyYWdlIHdpdGggXCRgciAoU3NQYXkgJT4lIGZpbHRlcighKFBheW1lbnQgJWluJSBjKDAsMzApKSkpJFBheW1lbnQgJT4lIG1lYW4gJT4lIHJvdW5kKDIpYAoKVGhlIGV4cGVyaW1lbnQgd2FzIGNvbmR1Y3RlZCB3aXRoIG9UcmVlICgqQ2l0YXRpb246IENoZW4sIEQuTC4sIFNjaG9uZ2VyLCBNLiwgV2lja2VucywgQy4sIDIwMTYuIG9UcmVlIC0gQW4gb3Blbi1zb3VyY2UgcGxhdGZvcm0gZm9yIGxhYm9yYXRvcnksIG9ubGluZSBhbmQgZmllbGQgZXhwZXJpbWVudHMuIEpvdXJuYWwgb2YgQmVoYXZpb3JhbCBhbmQgRXhwZXJpbWVudGFsIEZpbmFuY2UsIHZvbCA5OiA4OC05NyopIHN1YmplY3RzIHdlcmUgcmVjcnVpdGVkIHdpdGggaHJvb3QgKCpDaXRhdGlvbjogQm9jaywgT2xhZiwgSW5nbWFyIEJhZXRnZSAmIEFuZHJlYXMgTmlja2xpc2NoICgyMDE0KS4gaHJvb3Qg4oCTIEhhbWJ1cmcgcmVnaXN0cmF0aW9uIGFuZCBvcmdhbml6YXRpb24gb25saW5lIHRvb2wuIEV1cm9wZWFuIEVjb25vbWljIFJldmlldyA3MSwgMTE3LTEyMCopCgoKCgojIEh5cG90aGVzaXMgMSAtIGNvbXBldGl0aXZlbmVzcyBhbmQgbWFyay11cHMKCioqSHlwb3RoZXNpcyAxKiouICpTdGF0aWMgbWFyay11cHMgd2lsbCBiZSBsb3dlciBpbiBtb3JlIGNvbXBldGl0aXZlIChoaWdoZXIgTikgbWFya2V0cy4qCgpJbiB0aGUgcGxvdCBiZWxvdywgCgotIEVhY2ggZG90IGlzIHRoZSBhdmVyYWdlIHByaWNlIHBlciBzdWJqZWN0IGluIG9uZSBwZXJpb2QtaGFsZiAoMjAgc3VicGVyaW9kcywgdHdvIGhhbGZzKSB3aXRoIGZpeGVkIHNob3BwaW5nIGNvc3RzIGFuZCBwbGF5ZXIgY291bnQuIAotIFZpb2xpbnMgYXJlIHNpbWlsYXJseSBiYXNlZCBvbiBhdmVyYWdlIHBsYXllci1wZXJpb2QgcHJpY2VzLiAKLSBUaGUgbGluZSBpcyB0aGUgYXZlcmFnZSBwcmljZSBmb3IgdGhhdCBwbGF5ZXItbnVtYmVyIHBlcmlvZC1oYWxmIGNvbWJpbmF0aW9uLCAKLSBSaWJiZW4gaXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIG9uZSBzZSBwbHVzIG9yIG1pbnVzLiAKCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KYXZnX3Blcl9wcmljZXMgPC0gZnVuY3Rpb24oCiAgZGF0YSA9IHNlc3NEYXQsCiAgcnAgPSBOVUxMCil7CiAgZGYgPSBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZikKICAgICYgcGxheWVyLnJwID09IHJwCiAgKQoKZGYyID0gZGYgJT4lCiAgZ3JvdXBfYnkoZ3JvdXBfc2l6ZV9zdHIsIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUscGVyaW9kX2hhbGYsIHBsYXllci5tYykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgUHJpY2VfTWVkaWFuID0gbWVkaWFuKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9VcDEgPSBQcmljZSArIHNlKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9Ed24xID0gUHJpY2UgLSBzZShwbGF5ZXIucHJpY2UpCiAgKQoKcDEgPSBkZiAlPiUKICBnZ3Bsb3QoCiAgKSArCiAgZmFjZXRfZ3JpZChncm91cF9zaXplX3N0ciB+IHBlcmlvZF9oYWxmKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IHBsYXllci5wcmljZSwKICAgICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICAgIGdyb3VwID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIGFscGhhID0gMC4zLAogICAgY29sb3IgPSAiZ3JleTcwIgogICkgKwogIGdlb21fcmliYm9uKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5tYywgcGVyaW9kX2hhbGYpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xLAogICAgICBncm91cCA9IHBsYXllci5tYywKICAgICAgZmlsbCA9IHBsYXllci5tYwogICAgICAKICAgICksCiAgICBhbHBoYSA9IC4yCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5tYywgcGVyaW9kX2hhbGYpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpCiAgICAgICkgICwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHkgPSBtZWFuX3ByaWNlLAogICAgICBncm91cCA9IHBsYXllci5tYywKICAgICAgY29sb3IgPSBwbGF5ZXIubWMKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4yKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjQsIDAuNikKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSBnbHVlKCJBdmVyYWdlIFBlcmlvZCBQcmljZXMsIFJQOiB7cnB9IikKICApCgpyZXR1cm4ocDEpCiAgCn0KCmF2Z19wZXJfcHJpY2VzKHJwID0gMS4wKQphdmdfcGVyX3ByaWNlcyhycCA9IDAuOSkKYXZnX3Blcl9wcmljZXMocnAgPSAwLjgpCgoKCmBgYAoKSW4gdGhlIHBpbG90IHdlIGhhZCBhIHNwcmVhZCBvZiB0cmFuc3BvcnQgY29zdHMgZnJvbSAwLjEgdG8gMS4wLiBCZXR3ZWVuIDAuMSBhbmQgMC41IHRoZXJlIHdhc24ndCBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBwcmljZSwgb25seSBhdCAwLjc1IGFuZCAxLjAgZGlkIHdlIHNlZSBhIHN1YnN0YW50aWFsIGluY3JlYXNlIGluIG1hcmt1cHMuIEluIHRoaXMgZGVzaWduIHdlIG9ubHkgaGFkIGEgc3ByZWFkIG9mIHRyYW5zcG9ydCBjb3N0cyBiZXR3ZWVuIDAuMSBhbmQgMC42LCBhbmQgd2UgZG9uJ3Qgc2VlIGEgY29uc2lzdGVudCBpbmNyZWFzZSBpbiBwcmljZSBhcyB0cmFuc3BvcnQgY29zdHMgaW5jcmVhc2UuIAoKLSBSUCAwLjkgaXMgaW50ZXJlc3RpbmcuIAoKLS0tLS0tLS0tCgpJbiB0aGUgcGxvdCBiZWxvdywgCgotIGVhY2ggZG90IGlzIHRoZSBhdmVyYWdlIHByaWNlIHBlciBzdWJqZWN0IGluIG9uZSBwZXJpb2QgKDIwIHN1YnBlcmlvZHMpIHdpdGggZml4ZWQgc2hvcHBpbmcgY29zdHMgYW5kIHBsYXllciBjb3VudC4gCi0gdmlvbGlucyBhcmUgYmFzZWQgb24gYXZlcmFnZSBwbGF5ZXItcGVyaW9kIHByaWNlcy4gCi0gdGhlIGxpbmUgaXMgdGhlIGF2ZXJhZ2UgcHJpY2UgZm9yIHRoYXQgcGxheWVyLW51bWJlciwgc2hvcHBpbmcgY29zdCBjb212aW5hdGlvbiwgCi0gcmliYmVuIGlzIHRoZSBjb25maWRlbmNlIGludGVydmFsLCBvbmUgc2UgcGx1cyBvciBtaW51cy4gCi0gQSB2ZXJ5IHNpbWlsYXIgcGxvdCBhcHBlYXJzIHdoZW4gbG9va2luZyBhdCBhbGwgcHJpY2VzIG92ZXIgYWxsIHN1YnBlcmlvZHMuIAoKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgIGNhY2hlPUZBTFNFfQoKZGYyID0gc2Vzc0RhdCAlPiUKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGVyaW9kX2hhbGYsIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKSwKICAgIFByaWNlX01lZGlhbiA9IG1lZGlhbihwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfVXAxID0gUHJpY2UgKyBzZShwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfRHduMSA9IFByaWNlIC0gc2UocGxheWVyLnByaWNlKQogICkKCgoKZ2dwbG90KAogIGRmMgopICsKICBmYWNldF9ncmlkKHBsYXllck51bSB+IHBlcmlvZF9oYWxmKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IFByaWNlLAogICAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgYWxwaGEgPSAwLjMsCiAgICBjb2xvciA9ICJncmV5NzAiCiAgKSArCiAgZ2VvbV9yaWJib24oCiAgICBkYXRhID0gZGYyICU+JSAKICAgICAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSkKICAgICAgKSAgLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeSA9IG1lYW5fcHJpY2UKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4zKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDEuMCkKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJpY2VzIgogICkKCgoKCgogIApgYGAKCgotLS0tLS0tLS0tCgpDb21wYXJpbmcgcHJpY2VzIGluIGJvdGggdHJlYXRtZW50cy4gCi0gV2Ugc2VlIHdpdGggZ3JlYXRlciBjb21wZXRpdGlvbiB0aGVyZSBhcmUgbG93ZXIgcHJpY2VzIGFjY3Jvc3MgYWxsIHNob3BwaW5nIGNvc3RzLiAKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgIGNhY2hlPUZBTFNFfQoKCmRmMiA9IHNlc3NEYXQgJT4lICAKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIHBsYXllci5wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IHBhc3RlKG1lYW4ocGxheWVyLnByaWNlKSAlPiUgcm91bmQoMiksICIgKMKxIiwgc2UocGxheWVyLnByaWNlKSAlPiUgcm91bmQoNCksICAiKSIsIHNlcD0iIikKICApCgprYWJsZSgKICBmb3JtYXQgPSAibWFya2Rvd24iLAogIGRmMiAlPiV0aWR5cjo6c3ByZWFkKAogICAgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBQcmljZQogICksCiAgYWxpZ24gPSBjKCJsIiwiYyIsImMiLCJjIiwiYyIsImMiKSwKICAjIGNvbC5uYW1lcyA9IGMoIiIsICJzID0gMC4xIiwicyA9IDAuMjUiLCJzID0gMC41IiwicyA9IDAuNzUiLCJzID0gMSIpLAogIGNhcHRpb24gPSAiYWRzZnNlIgopCgpgYGAKCk5vdywgbG9va2luZyBqdXN0IGF0IHRoZSBsYXRlciBoYWxmIG9mIGVhY2ggcGVyaW9kLCBzdWJwZXJpb2RzIDExIHRvIDIwLCAocmVtb3ZlIGZyb20gZmluYWwpCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCmRmMiA9IHNlc3NEYXQgJT4lICAKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIHBsYXllci5wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IHBhc3RlKG1lYW4ocGxheWVyLnByaWNlKSAlPiUgcm91bmQoMiksICIgKMKxIiwgc2UocGxheWVyLnByaWNlKSAlPiUgcm91bmQoNCksICAiKSIsIHNlcD0iIikKICApCgprYWJsZSgKICBmb3JtYXQgPSAibWFya2Rvd24iLAogIGRmMiAlPiV0aWR5cjo6c3ByZWFkKAogICAgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBQcmljZQogICksCiAgYWxpZ24gPSBjKCJsIiwiYyIsImMiLCJjIiwiYyIsImMiKSwKICAjIGNvbC5uYW1lcyA9IGMoIiIsICJ0ID0gMC4xIiwidCA9IDAuMjUiLCJ0ID0gMC41IiwidCA9IDAuNzUiLCJ0ID0gMSIpLAogIGNhcHRpb24gPSAiYWRzZnNlIgopCgpgYGAKCgpTdHJvbmcgZXZpZGVuY2UgZm9yIEh5cG90aGVzaXMgMS4gCgotIExvb2tpbmcgYXQgdGhlIGF2ZXJhZ2UgcHJpY2VzIHdpdGhpbiBhIHBlcmlvZCAoYWxsIDIwIHN1YnBlcmlvZHMpIHdpdGggdGhlIHNhbWUgcGxheWVyIG51bWJlciBhbmQgdHJhbnNwb3J0IGNvc3QsIHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gcHJpY2VzIGF0IGVhY2ggdHJhbnNwb3J0IGxldmVsIGJldHdlZW4gcGxheWVyIG51bWJlciB0cmVhdG1lbnRzLiAKCgotIEV2ZW4gY29tcGFyaW5nIGB0ID0gNi4wYCBpbiB0aGUgZm91ciBwbGF5ZXIgZ2FtZSAtLSB0aGUgdHJhbnNwb3J0IGNvc3QgaW4gd2hpY2ggdGhlIGZvdXItcGxheWVyIGdhbWUgd2l0aCBoaWdoZXN0IHByaWNlcyAtLQp0byBgdCA9IDAuMjVgIGluIHRoZSB0d28gcGxheWVyIGdhbWUgLS0gaW4gd2hpY2ggcHJpY2VzIHdlcmUgdGhlIGxvd2VzdCBpbiB0aGUgdHdvLXBsYXllciBnYW1lIC0tIHRoZSB0d28gcGxheWVyIGdhbWUgaGFzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBoaWdoZXIgcHJpY2VzIChwLXZhbHVlIDwgMC4wMDEpLiAKCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCmRmMiA9IHNlc3NEYXQgJT4lICAKICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGFydGljaXBhbnQuY29kZSwgcGxheWVyLnBlcmlvZF9udW1iZXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBwbGF5ZXIucHJpY2UgPSBtZWFuKHBsYXllci5wcmljZSkKICApCiMgMC4xMCwgMC4yNSwgMC40MCwgMC42MGAKCgp3aXRoKGRmMiwgCiAgICAgdC50ZXN0KHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJUd28gUGxheWVyIiAmIHBsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjI1KV0sCiAgICAgICAgICAgIHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJGb3VyIFBsYXllciIgJiBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC42KV0KICAgICApCikKd2l0aChkZjIsIAogICAgIHdpbGNveC50ZXN0KHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJUd28gUGxheWVyIiAmIHBsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjI1KV0sIAogICAgICAgICAgICBwbGF5ZXIucHJpY2VbKHBsYXllck51bSA9PSAiRm91ciBQbGF5ZXIiICYgcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuNildCiAgICAgKQopCgoKYGBgCgojIEh5cG90aGVzaXMgMiAtIHNoaXBwaW5nIGNvc3RzIGFuZCBtYXJrLXVwcwoKKipIeXBvdGhlc2lzIDIqKiAtICpUaGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNob3BwaW5nIGNvc3RzIGFuZCBtYXJrLXVwcy4qCgojIyMgTG9va2luZyBhdCB0aGUgdHdvLXBsYXllciBnYW1lCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KIyB0d28gcGxheWVyCgpkZjIgPSBzZXNzRGF0ICU+JQogICAgZHBseXI6OmZpbHRlcigKICAgICAgcGxheWVyTnVtID09ICJUd28gUGxheWVyIiwKICAgICAgIWlzLm5hKHBlcmlvZF9oYWxmKQogICAgICApJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwYXJ0aWNpcGFudC5jb2RlLCBwZXJpb2RfaGFsZikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgUHJpY2VfTWVkaWFuID0gbWVkaWFuKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9VcDEgPSBQcmljZSArIHNlKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9Ed24xID0gUHJpY2UgLSBzZShwbGF5ZXIucHJpY2UpCiAgKQojYDAuMTAsIDAuMjUsIDAuNDAsIDAuNjBgCgpwMSA9IGdncGxvdCgKICBkZjIKKSArCiAgCiAgZmFjZXRfZ3JpZChwZXJpb2RfaGFsZiB+IC4pICsKICBnZW9tX3Zpb2xpbigKICAgIGFlcyh5ID0gUHJpY2UsCiAgICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgICBncm91cCA9IHBsYXllci50cmFuc3BvcnRfY29zdCksCiAgICBhbHBoYSA9IDAuMywKICAgIGNvbG9yID0gImdyZXk3MCIKICApICsKICBnZW9tX3JpYmJvbigKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfVXAxID0gbWVhbl9wcmljZSArIHNlKFByaWNlKSwKICAgICAgICBwcmljZV9zZV9Ed24xID0gbWVhbl9wcmljZSAtIHNlKFByaWNlKQogICAgICApLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeW1heCA9IHByaWNlX3NlX1VwMSwKICAgICAgeW1pbiA9IHByaWNlX3NlX0R3bjEKICAgICksCiAgICBhbHBoYSA9IC4yCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgICAgc3VtbWFyaXNlKAogICAgICAgIG1lYW5fcHJpY2UgPSBtZWFuKFByaWNlKQogICAgICApICAsIAogICAgYWVzKAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICB5ID0gbWVhbl9wcmljZQogICAgKQogICkgKwogIGdlb21faml0dGVyKAogICAgYWVzKAogICAgICB5ID0gUHJpY2UsCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksCiAgICAKICAgIGRhdGEgPSBkZjIsCiAgICB3aWR0aCA9IDAuMDIsCiAgICBoZWlnaHQgPSAwLAogICAgYWxwaGEgPSAwLjMpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gYygwLjEsIDAuMjUsIDAuNCwgMC42KQogICkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoCiAgICB4ID0gIlNob3BwaW5nIENvc3QiLAogICAgeSA9ICJQcmljZSIsCiAgICB0aXRsZSA9ICJBdmVyYWdlIFBlcmlvZCBQcmljZXMgLSBUd28gUGxheWVycyIKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwwLjcpLCB5bGltID0gYygwLDEpKSAKcDEKYGBgCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KIyBGb3VyIHBsYXllcgoKZGYyID0gc2Vzc0RhdCAlPiUKICAgICAgZHBseXI6OmZpbHRlcigKICAgICAgcGxheWVyTnVtID09ICJGb3VyIFBsYXllciIsCiAgICAgICFpcy5uYShwZXJpb2RfaGFsZikKICAgICAgKSU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGFydGljaXBhbnQuY29kZSwgcGVyaW9kX2hhbGYpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKSwKICAgIFByaWNlX01lZGlhbiA9IG1lZGlhbihwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfVXAxID0gUHJpY2UgKyBzZShwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfRHduMSA9IFByaWNlIC0gc2UocGxheWVyLnByaWNlKQogICkKCgoKcDIgPSBnZ3Bsb3QoCiAgZGYyCikgKwogIGZhY2V0X2dyaWQocGVyaW9kX2hhbGYgfiAuKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IFByaWNlLAogICAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgYWxwaGEgPSAwLjMsCiAgICBjb2xvciA9ICJncmV5NzAiCiAgKSArCiAgZ2VvbV9yaWJib24oCiAgICBkYXRhID0gZGYyICU+JSAKICAgICAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSkKICAgICAgKSAgLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeSA9IG1lYW5fcHJpY2UKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4zKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjQsIDAuNikKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJpY2VzIC0gRm91ciBQbGF5ZXJzIgogICkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDAuNyksIHlsaW0gPSBjKDAsMSkpIApwMgoKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgZXZhbCA9IFQsIHRpZHkgPSBUfQoKZGYgPSBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZikKICApICU+JSAKICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkKCmRmID0gZGYgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICBzdW1tYXJpc2UoCiAgICBuPW4oKSwKICAgIG1lYW5fcHJpY2UgPSBtZWFuKFByaWNlKSAlPiUgcm91bmQoMyksICAKICAgIG1lZGlhbl9wcmljZSA9IG1lZGlhbihQcmljZSkgJT4lIHJvdW5kKDMpLAogICAgc2VfcHJpY2UgPSAoc2QoUHJpY2UpLyhuKV4wLjUpICAlPiUgcm91bmQoMykKICApIAoKa2FibGUoCiAgZm9ybWF0ID0gIm1hcmtkb3duIiwgCiAgZGYsICBhbGlnbiA9IGMoImMiKSwKICBjb2wubmFtZXMgPSBjKCIiLCJTaG9wcGluZyBDb3N0IiwiTiIsIk1lYW4gUHJpY2UiLCJNZWRpYW4gUHJpY2UiLCJTdGFuZGFyZCBFcnJvciIpCikKYGBgCgpSZWNhbGwgdGhlcmUgd2VyZSBgciBzZXNzRGF0ICU+JSBmaWx0ZXIocGxheWVyTnVtID09ICJGb3VyIFBsYXllciIpICU+JSB1bmdyb3VwICU+JSBkaXN0aW5jdChwYXJ0aWNpcGFudC5jb2RlKSAlPiUgbnJvd2Agc3ViamVjdHMgaW4gdGhlIGZvdXItcGxheWVyIHRyZWF0bWVudCBhbmQgYHIgc2Vzc0RhdCAlPiUgZmlsdGVyKHBsYXllck51bSA9PSAiVHdvIFBsYXllciIpICU+JSB1bmdyb3VwICU+JSBkaXN0aW5jdChwYXJ0aWNpcGFudC5jb2RlKSAlPiUgbnJvd2Agc3ViamVjdHMgaW4gdGhlIHR3by1wbGF5ZXIgdHJlYXRtZW50LiAKCgojIyBJbml0aWFsIExvb2sgYXQgVHdvLVBsYXllciBHYW1lCgpGaXJzdCwgd2l0aGluIHRoZSB0d28gcGxheWVyIGdhbWUsIGNvbXBhcmluZyBwcmljZXMgaW4gYHQgPSAwLjFgIGFuZCBgdCA9IDAuNmAgKHNlZSBiZWxvdyksIHRoZXJlIGlzIHRvIGJlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLiAKClRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJpY2VzIGFuZCBzaG9wcGluZyBjb3N0IHRyZWF0bWVudHMuIEluIGhpZ2hlciBzaG9wcGluZyBjb3N0IHNldHRpbmdzIHN1YmplY3RzIHRlbmRlZCB0byBoYXZlIGhpZ2hlciBwcmljZXMuIAoKLSBVbml0IG9mIG9ic2VydmF0aW9uIGlzIGFuIGluZGl2aWR1YWwncyBhdmVyYWdlIHByaWNlIHdpdGhpbiBhIHBlcmlvZCwgYXQgYSBzZXQgc2hvcHBpbmcgY29zdCBsZXZlbC4gCi0gQSB0IHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlIDIuODY3ZS0xMQotIEEgTVcgcmFuayBzdW0gdGVzdCBjb21wYXJpbmcgcHJpY2VzIGJldHdlZW4gbWluIGFuZCBtYXggc2hvcHBpbmcgY29zdHMuIFByaWNlcyBhcmUgYXZlcmFnZSBwcmljZSBhdCB0aGUgc2Vzc2lvbiwgcGFydGljaXBhbnQsIGFuZCBwZXJpb2QgbGV2ZWwuIFAtdmFsdWUgMS4xMmUtMDkKCmBgYHtyLCBlY2hvPUZBTFNFfQpkZiA9ICBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZiksCiAgICBwbGF5ZXJOdW0gPT0gIlR3byBQbGF5ZXIiCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHNlc3Npb24uY29kZSwgcGFydGljaXBhbnQuY29kZSwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgIHN1bW1hcmlzZSgKICAgICBtZWFuX3ByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpCiAgICkKd2l0aChkZiwgdC50ZXN0KG1lYW5fcHJpY2VbcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuMV0sIG1lYW5fcHJpY2VbcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuNl0pKQp3aXRoKGRmLCB3aWxjb3gudGVzdChtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjFdLCBtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjZdKSkKCmBgYAoKCgojIyBJbml0aWFsIExvb2sgYXQgRm91ci1QbGF5ZXIgR2FtZQoKSW4gdGhlIGZvdXItcGxheWVyIGdhbWUgdGhlIHJlbGF0aW9uc2hpcCwgYXQgbGVhc3QgYmV0d2VlbiB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IHNob3BwaW5nIGNvc3QsIGRvZXMgbm90IGFwcGVhciBzdHJvbmdlci4KCi0gQSB0IHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlIDAuOTQ1OS4KLSBBIE1XIHJhbmsgc3VtIHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlID0gMC44OTE5CgoKYGBge3IsIGVjaG89RkFMU0V9CmRmID0gc2Vzc0RhdCAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEocGVyaW9kX2hhbGYpLAogICAgcGxheWVyTnVtID09ICJGb3VyIFBsYXllciIKICApICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbi5jb2RlLCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QscGxheWVyLnBlcmlvZF9udW1iZXIpICU+JQogICBzdW1tYXJpc2UoCiAgICAgbWVhbl9wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICApCndpdGgoZGYsIHQudGVzdChtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjFdLCBtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjZdKSkKd2l0aChkZiwgd2lsY294LnRlc3QobWVhbl9wcmljZVtwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC4xXSwgbWVhbl9wcmljZVtwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC42XSkpCgpgYGAKCgojIyBNb2RlbAoKT25seSBsb29raW5nIGF0IHRoZSBmaXJzdCBoYWxmIG9mIHBlcmlvZHMKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpkZiA9IHNlc3NEYXQgJT4lIAogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZiksCiAgICBwZXJpb2RfaGFsZiA9PSAiRmlyc3QgSGFsZiIKICApICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBzZXNzaW9uLmNvZGUsIHBhcnRpY2lwYW50LmNvZGUsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIHN1bW1hcmlzZSgKICAgIHByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgbWVkaWFuX3ByaWNlID0gbWVkaWFuKHBsYXllci5wcmljZSkKICApCgpwMT0gZ2dwbG90KAogIGRmLAogIGFlcygKICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICB5ID0gcHJpY2UsCiAgICBncm91cCA9IHBsYXllck51bSwKICAgIGNvbG9yID0gcGxheWVyTnVtCiAgKQopICsKICBnZW9tX2ppdHRlcigKICAgIGFlcyh5ID0gcHJpY2UpLAogICAgd2lkdGggPSAwLjA3LAogICAgYWxwaGEgPSAuMSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiCiAgICAKICApCnAxCmBgYAoKSGVyZSB3ZSBoYXZlIGEgbG9nLWxvZyBtb2RlbCByZWdyZXNzaW5nIHByaWNlcyBvbiBzaG9wcGluZyBjb3N0cywgd2l0aCBwbGF5ZXItbnVtYmVyIGZpeGVkIGVmZmVjdHMuIAoKJGxuKFBfe2lwfSkgPSBcYmV0YV8wICsgXGJldGFfMSBcZGVsdGFfe2l9ICsgXGJldGFfMiBsbihTX3tpcH0pICsgXGJldGFfMyBQZXJpb2RfcCArIFxlcHNpbG9uX3soaXApfSQKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpyZWcxID0gbG0oCiAgbG9nKHByaWNlKSB+IHBsYXllck51bSArIGxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICsgcGxheWVyLnBlcmlvZF9udW1iZXIsCiAgZGF0YSA9IGRmICU+JSBtdXRhdGUocHJpY2UgPSBwcmljZSArIDAuMDEpCikKCnN1bW1hcnkocmVnMSkKYGBgCgoKLSBXaGVyZSAkUF97aXB9JCBpcyB0aGUgYXZlcmFnZSBwcmljZSBmb3IgZm9yIHRoaXMgcGFydGljaXBhbnQgaW4gdGhpcyBwZXJpb2QsIHRoZSBhdmVyYWdlIG9mIDIwIHN1Yi1wZXJpb2RzLiAKLSAkXGRlbHRhX3tpfSQgaXMgYW4gaW5kaWNhdG9yIGVxdWFsIHRvIDEgaWYgaW5kaXZpZHVhbCAkaSQgcGFydGljaXBhdGVkIGluIHRoZSB0d28tcGxheWVyIHRyZWF0bWVudC4KLSAkU19pcCQgaXMgdGhlIHNob3BwaW5nIGNvc3QgdGhpcyBpbmRpdmlkdWFsIGZhY2VkIGluIHRoaXMgcGVyaW9kLiAKLSB3aGVyZSAkUGVyaW9kX3AkIGlzIHRoZSBwZXJpb2QgbnVtYmVyLiBQZXJpb2QgZml4ZWQgZWZmZWN0cy4gCgpJbiB0aGlzIHNwZWNpZmljYXRpb24sIHRoZSBjb2VmZmljaWVudCAkXGJldGFfMiQgbWVhc3VyZXMgdGhlIGF2ZXJhZ2UgZWZmZWN0IG9mIGJlaW5nIGFzc2lnbmVkIHRvIHRoZSBsZXNzIGNvbXBldGl0aXZlIHR3by1wbGF5ZXIgdHJlYXRtZW50IGdyb3VwLiBXaXRoICRcYmV0YV8yID0gLTAuMDU2MDQwJCwgYSAxJSBpbmNyZWFzZSBpbiBzaG9wcGluZyBjb3N0cyBsZWFkcyB0byBhIC01LjYlIGRlY3JlYXNlIGluIHByaWNlcy4gVGhpcyBpcyBzaWduaWZpY2FudC4gCgojIEh5cG90aGVzaXMgMyAtIG1hcmstdXAgcmVzcG9uc2l2ZW5lc3MgdG8gY29tcGV0aXRpb24gCgoqKkh5cG90aGVzaXMgMyoqLiAqTWFyay11cHMgd2lsbCBiZSBsZXNzIHJlc3BvbnNpdmUgdG8gY2hhbmdlcyBpbiBzaG9wcGluZyBjb3N0cyBpbiBsZXNzIGNvbXBldGl0aXZlIChsb3dlciBOKSBtYXJrZXRzLioKCiRsbihQcmljZV97KGkscCl9KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxkZWx0YV97MnB9ICsgXGJldGFfMiBsbihTaG9wcGluZ0Nvc3QpICsgXGJldGFfMyBcZGVsdGFfe2l9IGxuKFNob3BwaW5nQ29zdCkgICsgXGVwc2lsb25feyhpLHApfSQKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpyZWcyID0gbG0oCiAgbG9nKHByaWNlKSB+IHBsYXllck51bSArIGxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICsgcGxheWVyTnVtOmxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICwKICBkYXRhID0gZGYgJT4lIG11dGF0ZShwcmljZSA9IHByaWNlICsgMC4wMSkKKQoKc3VtbWFyeShyZWcyKQpgYGAKCgoKVGhlIGNvZWZmaWNpZW50ICRcYmV0YV8yJCBlc3RpbWF0ZXMgdGhhdCBhIDElIGluY3JlYXNlIGluIHNob3BwaW5nIGNvc3RzIHdpbGwgbGVhdmUgdG8gYSAzLjQlIGRlY3JlYXNlIGluIHByaWNlcyBpbiB0aGUgZm91ci1wbGF5ZXIgZ2FtZS4gVGhlICRcYmV0YV8zJCBjb2VmZmljaWVudCBpbmRpY2F0ZXMgKmEgb25lIHVuaXQgaW5jcmVhc2UgaW4gc2hvcHBpbmcgY29zdCBsZWFkcyB0byBhIDUuOSUgZGVjcmVhc2UgaW4gcHJpY2VzIGluIHRoZSB0d28tcGxheWVyIGdhbWUgcmVsYXRpdmUgdG8gdGhlIDQtcGxheWVyIGdhbWUqIi4gCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPUZBTFNFfQoKIyBsaWJyYXJ5KG1lbWlzYykKIyBsaWJyYXJ5KHBhbmRlcikKIyAKIyBteXRhYmxlIDwtIG10YWJsZSgKIyAgICdNb2RlbCAxJyA9IHJlZzEsCiMgICAnTW9kZWwgMicgPSByZWcyLAojICAgc3VtbWFyeS5zdGF0cyA9IGMoJ1Itc3F1YXJlZCcsJ0YnLCdwJywnTicpKQojIAojIChteXRhYmxlKQpgYGAKCgp8IERlcGVuZGVudCBWYXI6ICRsbihQX3tpcH0pJCAgICAgICAgICAgICAgfCBNb2RlbCAxICB8ICB8IE1vZGVsIDIgICAgfCB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tOnw6LS06fDotLS0tLS0tLS0tLS06fDotLS0tOnwKfCAgJFxkZWx0YV97aX0kICh0d28tcGxheWVyKSAgICAgICAgICAgICAgIHwgMC41NTkxMDEgICAgfCBcKlwqXCogfCAgMC40NTA1OCAgICB8IFwqXCpcKiAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMC4wMTU4NzApICB8ICAgICAgICB8ICgwLjA0MTU1KSAgIHwgfAp8ICAkbG4oU2hvcHBpbmdDb3N0KSQgICAgICAgICAgICAgICAgICAgICAgfCAtMC4wNTYwNDAgICB8IFwqXCpcKiB8IC0wLjA0ODQ0ICAgICB8IFwqXCpcKiAgfCAKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAuMDExMDIzKSAgfCAgICAgICAgfCAoMC4wMTU1OCkgICB8IHwKfCAgJFxkZWx0YV97aX0gXGNkb3QgbG4oU2hvcHBpbmdDb3N0KSQgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgfCAtMC4wNTg1NyAgICB8IFwqIHwgIAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICB8ICgwLjAyNDY0KSAgIHwgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwgfCAKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0gfCAtLS0gfCAtLS0tLS0gfCAtLS0gfAp8ICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTUyICAgIHwgIHwgNTUyICAgICB8ICB8CgojIEh5cG90aGVzaXMgNCAtIENvbGx1c2lvbiBhbmQgU2hvcHBpbmcgQ29zdHMKCioqSHlwb3RoZXNpcyA0KiouICpDb2xsdXNpb24gd2lsbCBiZSBlYXNpZXIgdG8gZm9ybSBpbiBsb3cgc2hvcHBpbmcgY29zdCBlbnZpcm9ubWVudHMqCgpEZWZpbmUgY29sbHVzaW9uCgojIyBJZGVhIDEgLSBKb2ludCBwb3NpdGl2ZSBwcm9maXRzLiAKCkEgc3ViamVjdCBpcyBzYWlkIHRvIGJlICdjb2xsdWRpbmcnIHdoZW4gdGhleSBhbmQgdGhlaXIgYWRqYWNlbnQgcGxheWVycyBoYXZlIGpvaW50bHkgcG9zaXRpdmUgcHJvZml0cy4gCiAgICAtIEluIHRoZSBzYXZlIG9mIHRoZSB0d28tcGxheWVyIGdhbWUsIGJvdGggcGxheWVycycgcHJvZml0cyBhcmUgcG9zaXRpdmUuIEluIHRoZSBjYXNlIG9mIHRoZSBmb3VyLXBsYXllciBnYW1lLCB0aGUgcHJvZml0cyBvZiB0aGUgdHdvIHBsYXllcnMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IChjaXJjbGUgbWFya2V0cGxhY2UpIGFyZSBwb3NpdGl2ZS4gCiAgICAtIFRoaXMgcG9zZXMgb2YgcHJvYmxlbSBpbiBjb21wYXJpbmcgImNvbGx1c2lvbiIgYmV0d2VlbiB0d28gYW5kIGZvdXItcGxheWVyIGdhbWVzLiBTbyB3ZSBzaG91bGQgbm90IGRvIHRoYXQuIAotIExvb2sgYXQgdmlvbGluZXMgZm9yIGJpdCAtIGJpLW1vZGFsIHNwbGl0cyBpbiBkaXN0cmlidXRpb24uIAoKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpkZiA9IHNlc3NEYXQgJT4lCiAgZHBseXI6OmZpbHRlcigKICAgIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyID4gMCwKICAgIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyIDwgMjEKICApICU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgc2Vzc2lvbi5jb2RlLHBsYXllci50cmFuc3BvcnRfY29zdCxwbGF5ZXJOdW0pICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBwcm9maXQgPSBzY29yZV9zdWJwZXJpb2QsCiAgICBwbGF5ZXIubG9jID0gcGFzdGUoIkxvYyIscGxheWVyLmxvYywgc2VwPSIiKQogICkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UocGxheWVyTnVtLCBzZXNzaW9uLmNvZGUsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIsZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgcGxheWVyLmxvYykgJT4lCiAgZHBseXI6OnNlbGVjdChwbGF5ZXJOdW0sIHNlc3Npb24uY29kZSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHBsYXllci5sb2MsIHByb2ZpdCkKICAKZGYycCA9IGRmICU+JQogIGZpbHRlcihwbGF5ZXJOdW0gPT0gIlR3byBQbGF5ZXIiKSAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyKSAlPiUKICBzcHJlYWQocGxheWVyLmxvYywgcHJvZml0KSAlPiUKICBtdXRhdGUoCiAgICBqb2luUG9zUHJvZml0ID0gaWZlbHNlKExvYzAuMjUgPiAwICYgTG9jMC43NSA+IDAsIDEsIDApCiAgKQoKZGY0cCA9IGRmICU+JQogIGZpbHRlcihwbGF5ZXJOdW0gPT0gIkZvdXIgUGxheWVyIikgJT4lIAogIGdyb3VwX2J5KGdyb3VwLmlkX2luX3N1YnNlc3Npb24pICU+JQogIHNwcmVhZChwbGF5ZXIubG9jLCBwcm9maXQpICU+JQogIG11dGF0ZSgKICAgIGpvaW5Qb3NQcm9maXQgPSBpZmVsc2UoTG9jMC4xMjUgPiAwICYgTG9jMC4zNzUgJiBMb2MwLjYyNSA+IDAgJiBMb2MwLjg3NSA+IDAsIDEsIDApCiAgKQoKCmRmMiA9IGJpbmRfcm93cygKICBkZjRwLCBkZjJwCikKCgoKCmthYmxlKAogIGZvcm1hdCA9ICJtYXJrZG93biIsIAogIGJpbmRfcm93cygKICAgIGRmMnAgJT4lCiAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIGpvaW5Qb3NQcm9maXRfbWVhbiA9IG1lYW4oam9pblBvc1Byb2ZpdCksCiAgICAgIG4gPSBsZW5ndGgodW5pcXVlKHBhc3RlKGdyb3VwLmlkX2luX3N1YnNlc3Npb24gLHBsYXllci5wZXJpb2RfbnVtYmVyKSkpCiAgICApLAogICAgZGY0cCAlPiUKICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgam9pblBvc1Byb2ZpdF9tZWFuID0gbWVhbihqb2luUG9zUHJvZml0KSwKICAgICAgbiA9IGxlbmd0aCh1bmlxdWUocGFzdGUoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiAscGxheWVyLnBlcmlvZF9udW1iZXIpKSkKICAgICkKICApLCAgCiAgYWxpZ24gPSBjKCJjIiksCiAgY29sLm5hbWVzID0gYygiIiwiU2hvcHBpbmcgQ29zdCIsIlBlcmNlbnQgb2YgUGVyaW9kIEpvaW50IFBvc2l0aXZlIFByb2ZpdHMiLCJQZXJpb2QgR3JvdXAgT2J2c2VydmF0aW9uIikKKQoKCmBgYAoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1GQUxTRX0KCgoKZ2dwbG90KAogIGRmMiAlPiUgCiAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24pICU+JQogICAgZHBseXI6OnN1bW1hcmlzZSgKICAgICAgam9pblBvc1Byb2ZpdCA9IG1lYW4oam9pblBvc1Byb2ZpdCkKICAgICkKKSArCiAgZmFjZXRfZ3JpZChwbGF5ZXJOdW0gfi4pICsKICBnZW9tX3Zpb2xpbigKICAgIGFlcyh5ID0gam9pblBvc1Byb2ZpdCwKICAgICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICAgIGdyb3VwID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIGFscGhhID0gMC4zLAogICAgY29sb3IgPSAiZ3JleTcwIgogICkgKwogIGdlb21fcmliYm9uKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgICAgc3VtbWFyaXNlKAogICAgICAgIG1lYW5fam9pblBvc1Byb2ZpdCA9IG1lYW4oam9pblBvc1Byb2ZpdCksCiAgICAgICAgam9pblBvc1Byb2ZpdF9zZV9VcDEgPSBtZWFuX2pvaW5Qb3NQcm9maXQgKyBzZShqb2luUG9zUHJvZml0KSwKICAgICAgICBqb2luUG9zUHJvZml0X3NlX0R3bjEgPSBtZWFuX2pvaW5Qb3NQcm9maXQgLSBzZShqb2luUG9zUHJvZml0KQogICAgICApLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeW1heCA9IGpvaW5Qb3NQcm9maXRfc2VfVXAxLAogICAgICB5bWluID0gam9pblBvc1Byb2ZpdF9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX2pvaW5Qb3NQcm9maXQgPSBtZWFuKGpvaW5Qb3NQcm9maXQpCiAgICAgICkgICwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHkgPSBtZWFuX2pvaW5Qb3NQcm9maXQKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IGpvaW5Qb3NQcm9maXQsCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksCiAgICB3aWR0aCA9IDAuMDIsCiAgICBoZWlnaHQgPSAwLAogICAgYWxwaGEgPSAwLjMpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gYygwLjEsIDAuMjUsIDAuNCwgLjYpCiAgKSArCiAgdGhlbWVfYncoKSArCiAgbGFicygKICAgIHggPSAiU2hvcHBpbmcgQ29zdCIsCiAgICB5ID0gIlBlcmNlbnQgb2YgUGVyaW9kIHdpdGggSm9pbnQgUG9zaXRpdmUgUHJvZml0cyIsCiAgICB0aXRsZSA9ICJKb2ludCBQb3NpdGl2ZSBQcm9maXRzIgogICkKCgpgYGAKClRoZXJlIGlzIHZpc3VhbGx5IHN1Z2dlc3RpdmUgZXZpZGVuY2UgdGhhdCB3aXRoIGhpZ2hlciBzaG9wcGluZyBjb3N0cywgZ3JvdXBzIGFyZSBiZXR0ZXIgYWJsZSB0byBjb2xsdWRlLiAKCgojIyBJZGVhIDIgLSBKdXN0IGxvb2sgYXQgcHJvZml0cy4gCgpBcmUgcHJvZml0cyBoaWdoZXI/IAogICAgLSBQZXJoYXBzIHRvbyBsaW5rZWQgdG8gdGhlIGRpc2N1c3Npb24gaW4gSHlwb3RoZXNpcyAxLTMuIAoKCmBgYHtyLCBlY2hvPUZBTFNFfQoKZGYgPSAgc2Vzc0RhdCAlPiUKICBmaWx0ZXIoCiAgICBwbGF5ZXIucGVyaW9kX251bWJlciA+IDAgCiAgICAmIHBsYXllci5wZXJpb2RfbnVtYmVyIDwgMjEKICAgICYgIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShwbGF5ZXJOdW0sIHBlcmlvZF9oYWxmLCBzZXNzaW9uLmNvZGUsIHBhcnRpY2lwYW50LmNvZGUsIHBsYXllci50cmFuc3BvcnRfY29zdCxwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgIHN1bW1hcmlzZSgKICAgICBtZWFuX3Byb2ZpdCA9IG1lYW4oc2NvcmVfc3VicGVyaW9kKQogICApCgpkZjIgPSBkZiAlPiUgCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwZXJpb2RfaGFsZiwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbWVhbl9wcm9maXQgPSBtZWFuKG1lYW5fcHJvZml0KQogICkKCmdncGxvdCgKIGRmCikgKwogIGZhY2V0X2dyaWQocGxheWVyTnVtIH4gcGVyaW9kX2hhbGYpICsKICAgIGdlb21fdmlvbGluKAogICAgYWVzKAogICAgICB4ID0gKHBsYXllci50cmFuc3BvcnRfY29zdCksCiAgICAgIHkgPSBtZWFuX3Byb2ZpdCwKICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksIGFscGhhID0gLjgKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeCA9IChwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgICB5ID0gbWVhbl9wcm9maXQKICAgICksIAogICAgYWxwaGEgPSAuMSwKICAgIHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiwKICAgIGFlcygKICAgICAgeSA9IG1lYW5fcHJvZml0LCAKICAgICAgeCA9IChwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpKQogICkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoCiAgICB4ID0gIlNob3BwaW5nIENvc3QiLAogICAgeSA9ICJBdmVyYWdlIFBlcmlvZCBQcm9maXQiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJvZml0cyBhbmQgU2hvcHBpbmcgQ29zdHMiCiAgKQoKCgoKYGBgCgojIyB0byBkbyBmb3IgY29sbHVzaW9uIAoKVGFpbGluZyB0aGluZzsgCgotIGdldCBpbnRvIG1vcmUgc2ltcGxlIGR5bmFtaWNzIG9mIGNvbGx1c2lvbi4uLi4gCgoKLS0tLSAKCmBgYHtyLCBlY2hvPUYsIHJlc3VsdHM9J2FzaXMnfQoKY2F0KAogICIgQ29tcGlsZWQgYnkgQ3VydGlzIEtlcGhhcnQsIGN1cnRpcy5rZXBoYXJ0QG55dS5lZHUsICIsCiAgIiB3aXRoIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gIiwKICBzZXAgPSAiIgopCmBgYAoKYGBge3IsIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9CgpjYXQoCiAgYXMuY2hhcmFjdGVyKFN5cy50aW1lKCkpLCIgR01ULCAiLAogIFN5cy50aW1lem9uZShsb2NhdGlvbiA9IFRSVUUpLAogIHNlcCA9ICIiCikKYGBgCgoKU29tZSBuZXcgc3R1ZmY6Ckxvb2sgYXQgaG93IGF2ZXJhZ2UgcHJpY2VzIGNoYW5nZSBhdCB0aGUgdGhyZXNob2xkIGFyb3VuZCB0aGUgZmlyc3QgaGFsZiBzZWNvbmQgaGFsZiBjaGFuZ2UuIEJlZ2luIGJ5IGJ1aWxkaW5nIGFuIGluZGljYXRvciBmb3Igd2hhdCB2YXJpYWJsZSBpcyBjaGFuZ2luZyAocnAsIHRyYW5zcG8sIG9yIG1pbGxjb3N0KSBhbmQgb25seSBhbmFseXplIGRhdGEgc3BlY2lmaWMgdG8gdGhvc2UgcXVlc3Rpb25zLCBvdGhlcndpc2UgeW91J3JlIG1peGluZyBhIGxvdCBvZiBlZmZlY3RzIHRvZ2V0aGVyLgoKUXVlc3Rpb24gMSwgd2hhdCBwYXJhbWV0ZXJzIGFyZSBjaGFuZ2luZyBpbiB0aGVzZSBkaWZmZXJlbnQgcGVyaW9kczoKQW5zd2VyOiBzZWUgZGF0YSB0YWJsZSBiZWxvdywgSSd2ZSBmaWd1cmVkIG91dCB3aGljaCBwYXJhbXRlcnMgY2hhbmdlIGluIGNlcnRhaW4gcGVyaW9kcy4KYGBge3IsIGVjaG89Rn0KClBlcmlvZENoYW5nZXNGaXJzdDwtc3Vic2V0KHNlc3NEYXQsIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyID4gMCAmIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyPDIxJnBlcmlvZF9oYWxmPT0iRmlyc3QgSGFsZiIpJT4lIAogIGdyb3VwX2J5KHBsYXllci5wZXJpb2RfbnVtYmVyLCBzZXNzaW9uLmNvZGUpICU+JSAKICBzdW1tYXJpc2UoCiAgICBUcmFuc3BvTWVhbiA9IG1lYW4ocGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIG1jTWVhbj1tZWFuKHBsYXllci5tYyksCiAgICBycE1lYW49bWVhbihwbGF5ZXIucnApCiAgKQpQZXJpb2RDaGFuZ2VzU2Vjb25kPC1zdWJzZXQoc2Vzc0RhdCwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIgPiAwICYgcGxheWVyLnN1YnBlcmlvZF9udW1iZXI8MjEmcGVyaW9kX2hhbGY9PSJTZWNvbmQgSGFsZiIpJT4lIAogIGdyb3VwX2J5KHBsYXllci5wZXJpb2RfbnVtYmVyLCBzZXNzaW9uLmNvZGUpICU+JSAKICBzdW1tYXJpc2UoCiAgICBUcmFuc3BvTWVhbiA9IG1lYW4ocGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIG1jTWVhbj1tZWFuKHBsYXllci5tYyksCiAgICBycE1lYW49bWVhbihwbGF5ZXIucnApCiAgKQoKUGVyaW9kQ2hhbmdlczwtbGVmdF9qb2luKFBlcmlvZENoYW5nZXNGaXJzdCxQZXJpb2RDaGFuZ2VzU2Vjb25kLGJ5ID0gYygicGxheWVyLnBlcmlvZF9udW1iZXIiLCAic2Vzc2lvbi5jb2RlIikpCgpQZXJpb2RDaGFuZ2VzPC1QZXJpb2RDaGFuZ2VzJT4lIAogIG11dGF0ZSgKICAgIFRyYW5zcG9DaGFuZ2UgPSBsb2coVHJhbnNwb01lYW4ueCktbG9nKFRyYW5zcG9NZWFuLnkpLAogICAgbWNDaGFuZ2U9bG9nKG1jTWVhbi54KS1sb2cobWNNZWFuLnkpLAogICAgcnBDaGFuZ2U9bG9nKHJwTWVhbi54KS1sb2cocnBNZWFuLnkpCiAgKQoKUGVyaW9kQ2hhbmdlczwtUGVyaW9kQ2hhbmdlcyU+JSAKICBtdXRhdGUoCiAgICBUcmFuc3BvQ2hhbmdlT25seSA9IGlmZWxzZShUcmFuc3BvQ2hhbmdlICE9IDAgJiBtY0NoYW5nZSA9PSAwJnJwQ2hhbmdlPT0wLCBUcmFuc3BvQ2hhbmdlLCBOQSksCiAgICBtY0NoYW5nZU9ubHkgPSBpZmVsc2UobWNDaGFuZ2UgIT0gMCAmIFRyYW5zcG9DaGFuZ2UgPT0gMCZycENoYW5nZT09MCwgbWNDaGFuZ2UsIE5BKSwKICAgICBycENoYW5nZU9ubHkgPSBpZmVsc2UocnBDaGFuZ2UgIT0gMCAmIFRyYW5zcG9DaGFuZ2UgPT0gMCZtY0NoYW5nZT09MCwgcnBDaGFuZ2UsIE5BKQogICkKCgpzZXNzRGF0PC0gbGVmdF9qb2luKHNlc3NEYXQsUGVyaW9kQ2hhbmdlc1ssYygicGxheWVyLnBlcmlvZF9udW1iZXIiLCJzZXNzaW9uLmNvZGUiLCJUcmFuc3BvQ2hhbmdlT25seSIsIm1jQ2hhbmdlT25seSIsInJwQ2hhbmdlT25seSIpXSxieT1jKCJwbGF5ZXIucGVyaW9kX251bWJlciIsICJzZXNzaW9uLmNvZGUiKSkKCgpgYGAKCldhbnQgdG8gZG8gYSByZWdyZXNzaW9uIG9uIHBlcmlvZHMgd2hlcmUgb25seSB0cmFuc3BvcnQgY29zdHMgY2hhbmdlZCBhbmQgdXNlIHBlcmlvZCBmaXhlZCBlZmZlY3RzIHRvIHN0cmlwIG91dCB0aGUgbGV2ZWwgZWZmZWN0cyBvZiB0aGUgb3RoZXIgcGFyYW1ldGVycy4KCmBgYHtyLCBlY2hvPUZ9CgojIFRyYW5zcG9SZWc8LXN1YnNldChzZXNzRGF0LCBwbGF5ZXIuc3VicGVyaW9kX251bWJlciA+IDAgJiBwbGF5ZXIuc3VicGVyaW9kX251bWJlcjwyMSZUcmFuc3BvQ2hhbmdlT25seSE9Ik5BIikKIyAKIyByZWdfdHJhbnNwbyA9IGxtKAojICAgbG9nKHBsYXllci5wcmljZSkgfiBwbGF5ZXJOdW0gKyBsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArIHBsYXllck51bTpsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArZmFjdG9yKHBsYXllci5wZXJpb2RfbnVtYmVyKSArZmFjdG9yKHNlc3Npb24uY29kZSksCiMgICBkYXRhID0gVHJhbnNwb1JlZwojICkKIyAKIyByZWdfdHJhbnNwbyA9IGxtKAojICAgbG9nKHBsYXllci5wcmljZSkgfiBmYWN0b3IoZ3JvdXBfc2l6ZSkgKyBsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArIGZhY3Rvcihncm91cF9zaXplKTpsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KStmYWN0b3IocGxheWVyLnBlcmlvZF9udW1iZXIpICtmYWN0b3Ioc2Vzc2lvbi5jb2RlKS0xLAojICAgZGF0YSA9IFRyYW5zcG9SZWcgJT4lIG11dGF0ZShwbGF5ZXIucHJpY2UgPSBwbGF5ZXIucHJpY2UgKyAwLjAxKQojICkKIyAKIyBzdW1tYXJ5KHJlZ190cmFuc3BvKQpgYGAKClRoZXNlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IG5lZ2F0aXZlIChpbnNpZ25pZmljYW50KSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0cmFuc3BvcnQgY29zdHMgYW5kIHByaWNlcyBpbiAyIHBsYXllciBnYW1lLCBhbmQgcG9zaXRpdmUsIHNpZ25pZmljYW50LCByZWxhdGlvbnNoaXAgaW4gdGhlIDRwIGdhbWUuIFRoZXNlIGFyZSB0aGUgc2FtZSByZXN1bHRzIHdlIGhhZCBpbiB0aGUgcGlsb3Qgc3R1ZHkgbW9yZSBvciBsZXNzLiA=